home *** CD-ROM | disk | FTP | other *** search
/ Greenhouse Effect Detection Expriment / NASA Greenhouse Effect Detection Expriment 1992 - Disc 2.iso / software / dos / cdf22pc / src / lib / cdfsel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-13  |  6.7 KB  |  253 lines

  1. /******************************************************************************
  2. *
  3. *  NSSDC/CDF                     CDF 'select' operations.
  4. *
  5. *  Version 1.0, 14-Feb-92, ST Systems (STX)
  6. *
  7. *  Modification history:
  8. *
  9. *   V1.0  14-Feb-92, J Love    Original version (was part of `cdflib.c').
  10. *
  11. ******************************************************************************/
  12.  
  13. #include "cdflib.h"
  14.  
  15. /******************************************************************************
  16. * CDFsel.
  17. ******************************************************************************/
  18.  
  19. CDFstatus CDFsel (ap, item, fnc)
  20. va_list *ap;
  21. long item;
  22. long *fnc;
  23. {
  24. CDFstatus Pstatus = CDF_OK;
  25.  
  26. switch (item) {
  27.   case CDF_: {
  28.     CDFid id;
  29.     id = va_arg (*ap, CDFid);
  30.     if (id < 0 || id > CDF_MAX_CDFS-1) return BAD_CDF_ID;
  31.     if (_CDFs[id] == NULL) return BAD_CDF_ID;
  32.     _CURcdf = _CDFs[id];
  33.     break;
  34.   }
  35.   case CDF_STATUS_: {
  36.     _CURstatus = va_arg (*ap, CDFstatus);
  37.     break;
  38.   }
  39.   case VAR_: {
  40.     long var_num;
  41.     var_num = va_arg (*ap, long);
  42.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  43.     if (var_num < 0 || var_num > CDF_MAX_VARS-1) return BAD_VAR_NUM;
  44.     if (_CURcdf->var[var_num] == NULL) return NO_SUCH_VAR;
  45.     _CURcdf->CURvar = _CURcdf->var[var_num];
  46.     break;
  47.   }
  48.   case VAR_NAME_: {
  49.     char *name;
  50.     struct varSTRUCT *Var;
  51.     name = va_arg (*ap, char *);     /* no truncation of name
  52.     if too long */
  53.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  54.     Var = _CURcdf->varHead;
  55.     while (Var != NULL) {
  56.       if (strcmpITB(Var->VDR.Name,name) == 0) break;
  57.       Var = Var->varNext;
  58.     }
  59.     if (Var == NULL)
  60.       return NO_SUCH_VAR;
  61.     else
  62.       _CURcdf->CURvar = Var;
  63.     break;
  64.   }
  65.   case CDF_RECNUMBER_: {
  66.     long recNum = va_arg (*ap, long);
  67.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  68.     if (recNum < 0) return BAD_REC_NUM;
  69.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  70.     _CURcdf->recnum = recNum;
  71.     break;
  72.   }
  73.   case CDF_RECCOUNT_: {
  74.     long recCount = va_arg (*ap, long);
  75.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  76.     if (recCount < 1) return BAD_REC_COUNT;
  77.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  78.     _CURcdf->reccount = recCount;
  79.     break;
  80.   }
  81.   case CDF_RECINTERVAL_: {
  82.     long recInterval = va_arg (*ap, long);
  83.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  84.     if (recInterval < 1) return BAD_REC_INTERVAL;
  85.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  86.     _CURcdf->recinterval = recInterval;
  87.     break;
  88.   }
  89.   case CDF_DIMINDICES_: {
  90.     long *indices = va_arg (*ap, long *);
  91.     long dimN;
  92.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  93.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  94.        if (indices[dimN] < 0 ||
  95.     indices[dimN] >= _CURcdf->GDR.DimSizes[dimN])
  96.     return BAD_DIM_INDEX;
  97.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  98.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  99.        _CURcdf->indices[dimN] = indices[dimN];
  100.     break;
  101.   }
  102.   case CDF_DIMCOUNTS_: {
  103.     long *counts = va_arg (*ap, long *);
  104.     long dimN;
  105.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  106.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  107.        if (counts[dimN] < 1) return BAD_DIM_COUNT;
  108.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  109.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  110.        _CURcdf->counts[dimN] = counts[dimN];
  111.     break;
  112.   }
  113.   case CDF_DIMINTERVALS_: {
  114.     long *intervals = va_arg (*ap, long *);
  115.     long dimN;
  116.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  117.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  118.        if (intervals[dimN] < 1) return BAD_DIM_INTERVAL;
  119.     if (_CURcdf->GDR.NumVar == 0) STATUSdisp (NO_VARS_IN_CDF, Pstatus);
  120.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++)
  121.        _CURcdf->intervals[dimN] = intervals[dimN];
  122.     break;
  123.   }
  124.   case VAR_SEQPOS_: {
  125.     long recNum;
  126.     long *indices;
  127.     long Voffset;     /* value offset within record */
  128.     long dimN;
  129.  
  130.     recNum = va_arg (*ap, long);
  131.     indices = va_arg (*ap, long *);
  132.  
  133.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  134.     if (_CURcdf->CURvar == NULL) return NO_VAR_SELECTED;
  135.     if (recNum < 0) return BAD_REC_NUM;
  136.     for (dimN = 0; dimN < _CURcdf->GDR.NumDims; dimN++) {
  137.        if (indices[dimN] < 0 || indices[dimN] >= _CURcdf->GDR.DimSizes[dimN])
  138.      return BAD_DIM_INDEX;
  139.     }
  140.  
  141.     INDICESoffsetV (_CURcdf->GDR.NumDims, _CURcdf->CURvar, indices, Voffset);
  142.     _CURcdf->CURvar->seqValueOffset = recNum *
  143.                       _CURcdf->CURvar->NphyRecValues + Voffset;
  144.  
  145.     break;
  146.   }
  147.   case ATTR_: {
  148.     long attrnum;
  149.     struct attrSTRUCT *Attr;
  150.     struct entrySTRUCT *Entry;
  151.  
  152.     attrnum = va_arg (*ap, long );
  153.  
  154.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  155.     if (attrnum < 0) return BAD_ATTR_NUM;
  156.  
  157.     Attr = _CURcdf->attrHead;
  158.     while (Attr != NULL) {
  159.       if (attrnum == Attr->ADR.Num) break;
  160.       Attr = Attr->attrNext;
  161.     }
  162.  
  163.     if (Attr != NULL) {
  164.       _CURcdf->CURattr = Attr;
  165.       if (_CURcdf->CURentryNum != RESERVED_ENTRYNUM) {
  166.     Entry = Attr->entryHead;
  167.     while (Entry != NULL) {
  168.       if (Entry->AEDR.Num == _CURcdf->CURentryNum) break;
  169.       Entry = Entry->entryNext;
  170.     }
  171.     if (Entry != NULL)
  172.       _CURcdf->CURentry = Entry;
  173.     else
  174.       _CURcdf->CURentry = NULL;
  175.       }
  176.       else
  177.     _CURcdf->CURentry = NULL;
  178.     }
  179.     else
  180.       return NO_SUCH_ATTR;
  181.  
  182.     break;
  183.   }
  184.   case ATTR_NAME_: {
  185.     char *name;
  186.     struct attrSTRUCT *Attr;
  187.     struct entrySTRUCT *Entry;
  188.  
  189.     name = va_arg (*ap, char *);     /* no truncation of name if too long */
  190.  
  191.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  192.  
  193.     Attr = _CURcdf->attrHead;
  194.     while (Attr != NULL) {
  195.       if (strcmpITB(name,Attr->ADR.Name) == 0) break;
  196.       Attr = Attr->attrNext;
  197.     }
  198.  
  199.     if (Attr != NULL) {
  200.       _CURcdf->CURattr = Attr;
  201.       if (_CURcdf->CURentryNum != RESERVED_ENTRYNUM) {
  202.     Entry = Attr->entryHead;
  203.     while (Entry != NULL) {
  204.       if (Entry->AEDR.Num == _CURcdf->CURentryNum) break;
  205.       Entry = Entry->entryNext;
  206.     }
  207.     if (Entry != NULL)
  208.       _CURcdf->CURentry = Entry;
  209.     else
  210.       _CURcdf->CURentry = NULL;
  211.       }
  212.       else
  213.     _CURcdf->CURentry = NULL;
  214.     }
  215.     else
  216.       return NO_SUCH_ATTR;
  217.     break;
  218.   }
  219.   case ENTRY_: {
  220.     long entryNum;
  221.     struct entrySTRUCT *Entry;
  222.  
  223.     entryNum = va_arg (*ap, long );
  224.  
  225.     if (_CURcdf == NULL) return NO_CDF_SELECTED;
  226.     if (entryNum < 0) return BAD_ENTRY_NUM;
  227.  
  228.     _CURcdf->CURentryNum = entryNum;
  229.  
  230.     if (_CURcdf->CURattr != NULL) {
  231.       Entry = _CURcdf->CURattr->entryHead;
  232.       while (Entry != NULL) {
  233.     if (Entry->AEDR.Num == entryNum) break;
  234.     Entry = Entry->entryNext;
  235.       }
  236.       if (Entry != NULL)
  237.     _CURcdf->CURentry = Entry;
  238.       else
  239.     _CURcdf->CURentry = NULL;
  240.     }
  241.     else
  242.       _CURcdf->CURentry = NULL;
  243.  
  244.     break;
  245.   }
  246.   default: {
  247.     *fnc = item;
  248.     break;
  249.   }
  250. }
  251. return Pstatus;
  252. }
  253.